package com.sagframe.sagacity.sqltoy.plus.helper;

import org.sagacity.sqltoy.config.model.EntityMeta;
import org.sagacity.sqltoy.dao.SqlToyLazyDao;
import com.sagframe.sagacity.sqltoy.plus.conditions.Wrapper;
import org.sagacity.sqltoy.model.EntityQuery;
import org.sagacity.sqltoy.model.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SqlToyHelperDao {

    @Autowired
    private SqlToyLazyDao baseDao;

    /**
     * 查询一条记录,如果出现多条记录,获取其中第一条记录
     *
     * @param wrapper
     * @return
     */
    public <T> T findOne(Wrapper<T> wrapper) {
        List<T> rs = findList(wrapper);
        if (rs == null || rs.isEmpty()) {
            return null;
        }
        return rs.get(0);
    }

    /**
     * 根据查询条件查询, 仅支持单表条件
     *
     * @param wrapper
     *            - 查询条件
     * @return 结果集
     */
    public <T> List<T> findList(Wrapper<T> wrapper) {
        EntityMeta entityMeta = baseDao.getEntityMeta(wrapper.entityClass());
        //开始组装sql
        wrapper.assemble(entityMeta::getColumnName);
        EntityQuery query = wrapper.collect();
        return baseDao.findEntity(wrapper.entityClass(), query);
    }

    /**
     * 根据查询条件分页查询, 仅支持单表条件
     *
     * @param wrapper
     *            - 查询条件
     * @param page
     *            - 分页条件
     * @param <T>
     * @return
     */
    public <T> Page<T> findPage(Wrapper<T> wrapper, Page<?> page) {
        EntityMeta entityMeta = baseDao.getEntityMeta(wrapper.entityClass());
        //开始组装sql
        wrapper.assemble(entityMeta::getColumnName);
        EntityQuery query = wrapper.collect();
        return baseDao.findPageEntity(page, wrapper.entityClass(), query);
    }

    /**
     * 删除
     * @param wrapper
     *          - 删除条件
     * @param <T>
     */
    public <T> void delete(Wrapper<T> wrapper) {
        EntityMeta entityMeta = baseDao.getEntityMeta(wrapper.entityClass());
        //开始组装sql
        wrapper.assemble(entityMeta::getColumnName);
        EntityQuery query = wrapper.collect();
        baseDao.deleteByQuery(wrapper.entityClass(), query);
    }
}
